home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / swingall.jar / javax / swing / text / PlainView.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-07-15  |  9.4 KB  |  374 lines

  1. package javax.swing.text;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Container;
  6. import java.awt.Font;
  7. import java.awt.FontMetrics;
  8. import java.awt.Graphics;
  9. import java.awt.Rectangle;
  10. import java.awt.Shape;
  11. import javax.swing.event.DocumentEvent;
  12. import javax.swing.event.DocumentEvent.EventType;
  13. import javax.swing.text.Position.Bias;
  14.  
  15. public class PlainView extends View implements TabExpander {
  16.    protected FontMetrics metrics;
  17.    Element longLine;
  18.    Font font;
  19.    Segment lineBuffer = new Segment();
  20.    int tabSize;
  21.    int tabBase;
  22.    int sel0;
  23.    int sel1;
  24.    Color unselected;
  25.    Color selected;
  26.  
  27.    public PlainView(Element var1) {
  28.       super(var1);
  29.    }
  30.  
  31.    Shape adjustPaintRegion(Shape var1) {
  32.       return var1;
  33.    }
  34.  
  35.    private void calculateLongestLine() {
  36.       Container var1 = ((View)this).getContainer();
  37.       this.font = ((Component)var1).getFont();
  38.       this.metrics = ((Component)var1).getFontMetrics(this.font);
  39.       Document var2 = ((View)this).getDocument();
  40.       Element var3 = ((View)this).getElement();
  41.       int var4 = var3.getElementCount();
  42.       int var5 = -1;
  43.  
  44.       for(int var6 = 0; var6 < var4; ++var6) {
  45.          Element var7 = var3.getElement(var6);
  46.          int var8 = this.getLineWidth(var7);
  47.          if (var8 > var5) {
  48.             var5 = var8;
  49.             this.longLine = var7;
  50.          }
  51.       }
  52.  
  53.    }
  54.  
  55.    public void changedUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  56.       this.updateDamage(var1, var2, var3);
  57.    }
  58.  
  59.    private void damageLineRange(int var1, int var2, Shape var3, Component var4) {
  60.       if (var3 != null) {
  61.          Rectangle var5 = this.lineToRect(var3, var1);
  62.          Rectangle var6 = this.lineToRect(var3, var2);
  63.          if (var5 != null && var6 != null) {
  64.             Rectangle var7 = var5.union(var6);
  65.             var4.repaint(var7.x, var7.y, var7.width, var7.height);
  66.          } else {
  67.             var4.repaint();
  68.          }
  69.       }
  70.  
  71.    }
  72.  
  73.    private int drawElement(Element var1, Graphics var2, int var3, int var4) throws BadLocationException {
  74.       int var5 = var1.getStartOffset();
  75.       int var6 = var1.getEndOffset();
  76.       var6 = Math.min(((View)this).getDocument().getLength(), var6);
  77.       AttributeSet var7 = var1.getAttributes();
  78.       if (Utilities.isComposedTextAttributeDefined(var7)) {
  79.          var2.setColor(this.unselected);
  80.          var3 = Utilities.drawComposedText(var7, var2, var3, var4, var5 - var1.getStartOffset(), var6 - var1.getStartOffset());
  81.       } else if (this.sel0 == this.sel1) {
  82.          var3 = this.drawUnselectedText(var2, var3, var4, var5, var6);
  83.       } else if (var5 >= this.sel0 && var5 <= this.sel1 && var6 >= this.sel0 && var6 <= this.sel1) {
  84.          var3 = this.drawSelectedText(var2, var3, var4, var5, var6);
  85.       } else if (this.sel0 >= var5 && this.sel0 <= var6) {
  86.          if (this.sel1 >= var5 && this.sel1 <= var6) {
  87.             var3 = this.drawUnselectedText(var2, var3, var4, var5, this.sel0);
  88.             var3 = this.drawSelectedText(var2, var3, var4, this.sel0, this.sel1);
  89.             var3 = this.drawUnselectedText(var2, var3, var4, this.sel1, var6);
  90.          } else {
  91.             var3 = this.drawUnselectedText(var2, var3, var4, var5, this.sel0);
  92.             var3 = this.drawSelectedText(var2, var3, var4, this.sel0, var6);
  93.          }
  94.       } else if (this.sel1 >= var5 && this.sel1 <= var6) {
  95.          var3 = this.drawSelectedText(var2, var3, var4, var5, this.sel1);
  96.          var3 = this.drawUnselectedText(var2, var3, var4, this.sel1, var6);
  97.       } else {
  98.          var3 = this.drawUnselectedText(var2, var3, var4, var5, var6);
  99.       }
  100.  
  101.       return var3;
  102.    }
  103.  
  104.    protected void drawLine(int var1, Graphics var2, int var3, int var4) {
  105.       Element var5 = ((View)this).getElement().getElement(var1);
  106.  
  107.       try {
  108.          if (var5.isLeaf()) {
  109.             this.drawElement(var5, var2, var3, var4);
  110.          } else {
  111.             int var7 = var5.getElementCount();
  112.  
  113.             for(int var8 = 0; var8 < var7; ++var8) {
  114.                Element var6 = var5.getElement(var8);
  115.                var3 = this.drawElement(var6, var2, var3, var4);
  116.             }
  117.          }
  118.  
  119.       } catch (BadLocationException var9) {
  120.          throw new StateInvariantError("Can't render line: " + var1);
  121.       }
  122.    }
  123.  
  124.    protected int drawSelectedText(Graphics var1, int var2, int var3, int var4, int var5) throws BadLocationException {
  125.       var1.setColor(this.selected);
  126.       Document var6 = ((View)this).getDocument();
  127.       var6.getText(var4, var5 - var4, this.lineBuffer);
  128.       return Utilities.drawTabbedText(this.lineBuffer, var2, var3, var1, this, var4);
  129.    }
  130.  
  131.    protected int drawUnselectedText(Graphics var1, int var2, int var3, int var4, int var5) throws BadLocationException {
  132.       var1.setColor(this.unselected);
  133.       Document var6 = ((View)this).getDocument();
  134.       var6.getText(var4, var5 - var4, this.lineBuffer);
  135.       return Utilities.drawTabbedText(this.lineBuffer, var2, var3, var1, this, var4);
  136.    }
  137.  
  138.    protected final Segment getLineBuffer() {
  139.       return this.lineBuffer;
  140.    }
  141.  
  142.    private int getLineWidth(Element var1) {
  143.       int var2 = var1.getStartOffset();
  144.       int var3 = var1.getEndOffset();
  145.  
  146.       int var4;
  147.       try {
  148.          var1.getDocument().getText(var2, var3 - var2, this.lineBuffer);
  149.          var4 = Utilities.getTabbedTextWidth(this.lineBuffer, this.metrics, this.tabBase, this, var2);
  150.       } catch (BadLocationException var5) {
  151.          var4 = 0;
  152.       }
  153.  
  154.       return var4;
  155.    }
  156.  
  157.    public float getPreferredSpan(int var1) {
  158.       this.updateMetrics();
  159.       switch (var1) {
  160.          case 0:
  161.             return (float)this.getLineWidth(this.longLine);
  162.          case 1:
  163.             return (float)(((View)this).getElement().getElementCount() * this.metrics.getHeight());
  164.          default:
  165.             throw new IllegalArgumentException("Invalid axis: " + var1);
  166.       }
  167.    }
  168.  
  169.    protected int getTabSize() {
  170.       Integer var1 = (Integer)((View)this).getDocument().getProperty("tabSize");
  171.       int var2 = var1 != null ? var1 : 8;
  172.       return var2;
  173.    }
  174.  
  175.    public void insertUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  176.       this.updateDamage(var1, var2, var3);
  177.    }
  178.  
  179.    private Rectangle lineToRect(Shape var1, int var2) {
  180.       Rectangle var3 = null;
  181.       if (this.metrics != null) {
  182.          Rectangle var4 = var1.getBounds();
  183.          var3 = new Rectangle(var4.x, var4.y + var2 * this.metrics.getHeight(), var4.width, this.metrics.getHeight());
  184.       }
  185.  
  186.       return var3;
  187.    }
  188.  
  189.    public Shape modelToView(int var1, Shape var2, Position.Bias var3) throws BadLocationException {
  190.       Document var4 = ((View)this).getDocument();
  191.       Element var5 = ((View)this).getElement();
  192.       int var6 = var5.getElementIndex(var1);
  193.       Rectangle var7 = this.lineToRect(var2, var6);
  194.       this.tabBase = var7.x;
  195.       Element var8 = var5.getElement(var6);
  196.       int var9 = var8.getStartOffset();
  197.       var4.getText(var9, var1 - var9, this.lineBuffer);
  198.       int var10 = Utilities.getTabbedTextWidth(this.lineBuffer, this.metrics, this.tabBase, this, var9);
  199.       var7.x += var10;
  200.       var7.width = 1;
  201.       var7.height = this.metrics.getHeight();
  202.       return var7;
  203.    }
  204.  
  205.    public float nextTabStop(float var1, int var2) {
  206.       if (this.tabSize == 0) {
  207.          return var1;
  208.       } else {
  209.          int var3 = ((int)var1 - this.tabBase) / this.tabSize;
  210.          return (float)(this.tabBase + (var3 + 1) * this.tabSize);
  211.       }
  212.    }
  213.  
  214.    public void paint(Graphics var1, Shape var2) {
  215.       Shape var3 = var2;
  216.       var2 = this.adjustPaintRegion(var2);
  217.       Rectangle var4 = (Rectangle)var2;
  218.       this.tabBase = var4.x;
  219.       JTextComponent var5 = (JTextComponent)((View)this).getContainer();
  220.       var1.setFont(((Component)var5).getFont());
  221.       this.sel0 = var5.getSelectionStart();
  222.       this.sel1 = var5.getSelectionEnd();
  223.       this.unselected = ((Component)var5).isEnabled() ? ((Component)var5).getForeground() : var5.getDisabledTextColor();
  224.       Caret var6 = var5.getCaret();
  225.       this.selected = var6.isSelectionVisible() ? var5.getSelectedTextColor() : this.unselected;
  226.       this.updateMetrics();
  227.       Rectangle var7 = var1.getClipBounds();
  228.       int var8 = this.metrics.getHeight();
  229.       int var9 = var4.y + var4.height - (var7.y + var7.height);
  230.       int var10 = Math.max(0, var9 / var8);
  231.       int var11 = var7.y - var4.y;
  232.       int var12 = Math.max(0, var11 / var8);
  233.       int var13 = var4.height / var8;
  234.       if (var4.height % var8 != 0) {
  235.          ++var13;
  236.       }
  237.  
  238.       Rectangle var14 = this.lineToRect(var2, var12);
  239.       int var15 = var14.y + this.metrics.getAscent();
  240.       int var16 = var14.x;
  241.       Element var17 = ((View)this).getElement();
  242.       int var18 = var17.getElementCount();
  243.       int var19 = Math.min(var18, var13 - var10);
  244.       --var18;
  245.       Highlighter var20 = var5.getHighlighter();
  246.       LayeredHighlighter var21 = var20 instanceof LayeredHighlighter ? (LayeredHighlighter)var20 : null;
  247.  
  248.       for(int var22 = var12; var22 < var19; ++var22) {
  249.          if (var21 != null) {
  250.             Element var23 = var17.getElement(var22);
  251.             if (var22 == var18) {
  252.                var21.paintLayeredHighlights(var1, var23.getStartOffset(), var23.getEndOffset(), var3, var5, this);
  253.             } else {
  254.                var21.paintLayeredHighlights(var1, var23.getStartOffset(), var23.getEndOffset() - 1, var3, var5, this);
  255.             }
  256.          }
  257.  
  258.          this.drawLine(var22, var1, var16, var15);
  259.          var15 += var8;
  260.       }
  261.  
  262.    }
  263.  
  264.    public void preferenceChanged(View var1, boolean var2, boolean var3) {
  265.       ((View)this).getDocument().putProperty("lineLimit", (Object)null);
  266.       super.preferenceChanged(var1, var2, var3);
  267.    }
  268.  
  269.    public void removeUpdate(DocumentEvent var1, Shape var2, ViewFactory var3) {
  270.       this.updateDamage(var1, var2, var3);
  271.    }
  272.  
  273.    void updateDamage(DocumentEvent var1, Shape var2, ViewFactory var3) {
  274.       Container var4 = ((View)this).getContainer();
  275.       if (((Component)var4).isShowing()) {
  276.          this.updateMetrics();
  277.          Element var5 = ((View)this).getElement();
  278.          DocumentEvent.ElementChange var6 = var1.getChange(var5);
  279.          Element[] var7 = var6 != null ? var6.getChildrenAdded() : null;
  280.          Element[] var8 = var6 != null ? var6.getChildrenRemoved() : null;
  281.          if (var7 != null && var7.length > 0 || var8 != null && var8.length > 0) {
  282.             if (var7 != null) {
  283.                int var13 = this.getLineWidth(this.longLine);
  284.  
  285.                for(int var15 = 0; var15 < var7.length; ++var15) {
  286.                   int var16 = this.getLineWidth(var7[var15]);
  287.                   if (var16 > var13) {
  288.                      var13 = var16;
  289.                      this.longLine = var7[var15];
  290.                   }
  291.                }
  292.             }
  293.  
  294.             if (var8 != null) {
  295.                for(int var14 = 0; var14 < var8.length; ++var14) {
  296.                   if (var8[var14] == this.longLine) {
  297.                      this.calculateLongestLine();
  298.                      break;
  299.                   }
  300.                }
  301.             }
  302.  
  303.             this.preferenceChanged((View)null, true, true);
  304.             ((Component)var4).repaint();
  305.          } else {
  306.             Element var9 = ((View)this).getElement();
  307.             int var10 = var9.getElementIndex(var1.getOffset());
  308.             this.damageLineRange(var10, var10, var2, var4);
  309.             if (var1.getType() == EventType.INSERT) {
  310.                int var11 = this.getLineWidth(this.longLine);
  311.                Element var12 = var9.getElement(var10);
  312.                if (var12 == this.longLine) {
  313.                   this.preferenceChanged((View)null, true, false);
  314.                } else if (this.getLineWidth(var12) > var11) {
  315.                   this.longLine = var12;
  316.                   this.preferenceChanged((View)null, true, false);
  317.                }
  318.             } else if (var1.getType() == EventType.REMOVE && var9.getElement(var10) == this.longLine) {
  319.                this.calculateLongestLine();
  320.                this.preferenceChanged((View)null, true, false);
  321.             }
  322.          }
  323.       }
  324.  
  325.    }
  326.  
  327.    final void updateMetrics() {
  328.       Container var1 = ((View)this).getContainer();
  329.       Font var2 = ((Component)var1).getFont();
  330.       if (this.font != var2) {
  331.          this.calculateLongestLine();
  332.          this.tabSize = this.getTabSize() * this.metrics.charWidth('m');
  333.       }
  334.  
  335.    }
  336.  
  337.    public int viewToModel(float var1, float var2, Shape var3, Position.Bias[] var4) {
  338.       var4[0] = Bias.Forward;
  339.       Rectangle var5 = var3.getBounds();
  340.       Document var6 = ((View)this).getDocument();
  341.       int var7 = (int)var1;
  342.       int var8 = (int)var2;
  343.       if (var8 < var5.y) {
  344.          return ((View)this).getStartOffset();
  345.       } else if (var8 > var5.y + var5.height) {
  346.          return ((View)this).getEndOffset() - 1;
  347.       } else {
  348.          Element var9 = var6.getDefaultRootElement();
  349.          int var10 = Math.abs((var8 - var5.y) / this.metrics.getHeight());
  350.          if (var10 >= var9.getElementCount()) {
  351.             return ((View)this).getEndOffset() - 1;
  352.          } else {
  353.             Element var11 = var9.getElement(var10);
  354.             if (var7 < var5.x) {
  355.                return var11.getStartOffset();
  356.             } else if (var7 > var5.x + var5.width) {
  357.                return var11.getEndOffset() - 1;
  358.             } else {
  359.                try {
  360.                   int var12 = var11.getStartOffset();
  361.                   int var13 = var11.getEndOffset() - 1;
  362.                   var6.getText(var12, var13 - var12, this.lineBuffer);
  363.                   this.tabBase = var5.x;
  364.                   int var14 = var12 + Utilities.getTabbedTextOffset(this.lineBuffer, this.metrics, this.tabBase, var7, this, var12);
  365.                   return var14;
  366.                } catch (BadLocationException var15) {
  367.                   return -1;
  368.                }
  369.             }
  370.          }
  371.       }
  372.    }
  373. }
  374.